package com.dai.consumer_feign31.config;

import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

@Configuration
public class ConfigBean {
    @Bean
    //开启负载均衡 一大堆请求过来(进消费者)，然后肯定是通过rest来调用服务提供者，那么大一堆服务提供者调谁呢？
    //就通过这个注解来改变rest调用从而选择调谁(里面肯定有默认算法来决定到底调用谁)
    //ribbon的默认负载均衡算法是轮询 - 一人调一次
    @LoadBalanced
    public RestTemplate getRestTemplate(){
        return new RestTemplate();
    }

    //负载均衡的7种算法说明 -- 当采用自定义负载均衡算法后，这种选择出厂负载均衡算法就不能有了
    @Bean
    public IRule iRule(){
        //负载均衡算法采用轮询算法 - 默认
        //return new RoundRobinRule();

        //负载均衡算法采用随机算法
        return new RandomRule();

        //会先过滤掉由于多次访问故障而处于断路器跳闸状态的服务，还有并发的连接数量超过阈值的服务
        //然后对剩余的服务列表按照轮询策略进行访问
        //return new AvailabilityFilteringRule();

        //根据平均响应时间计算所有服务的权重，响应时间越快服务权重越大被选中的概率越高
        //刚启动时如果统计信息不足，则使用轮询策略，等统计信息足够再进行权重选择
        //return new WeightedResponseTimeRule();

        //先按照轮询策略获取服务，如果某个实例服务获取失败几次以后
        //下次直接就不管这个失败的服务了，直接跳过这个失败服务转而获取另外的集群服务
        //注意：本次获取失败了则整个请求都失败了并不会在本请求内再去获取其他服务
        //就这样失败几次后，下次跳过这个失败的服务
        //return new RetryRule();

        //会先过滤掉由于多次访问故障而处于断路器跳闸状态的服务，然后选择一个并发量最小的服务
        //return new BestAvailableRule();

        //复合判断server所在区域的性能和server的可用性选择服务器
//        return new ZoneAvoidanceRule();
    }
}
